/*
 * @(#)ServiceImpl.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.nhncorp.usf.core.config.runtime;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.nhncorp.usf.core.service.ServiceType;

/**
 * {@link Service} 를 구현한 Abstract 클래스<br/>하위 서비스 목록만 관리한다.
 * 
 * @author Web Platform Development Team.
 * */
public abstract class ServiceImpl implements Service {
	private List<Service> services;
	private String nodeName;
	private Service parent;

	/**
     * {@code position} 위치의 하위 {@link Service} 를 반환한다.
     * 
     * @param position 반환할 하위 Service Position
     * @return 하위의 {@link Service}
     */
	@Override
	public Service getServiceInfo(int position) {
		if (services != null && services.size() > position) {
			return services.get(position);
		} else {
			return null;
		}
	}

	/**
	 * 하위의 {@link Service} 를 반환한다.
	 * 
	 * @return 하위의 {@link Service}
	 * */
	@Override
	public List<Service> getServiceInfos() {
		if (services != null) {
			return services;
		} else {
			return Collections.emptyList();
		}
	}

	/**
     * {@code service} 를 하위 Service 로 추가한다.
     * 
     * @param service 추가할 하위 {@link Service}
     * */
	@Override
	public void addServiceInfo(Service service) {
		if (services == null) {
			services = new ArrayList<Service>();
		}
		
		services.add(service);
	}
	
	/**
	 * {@link Service} 의 타입을 반환한다
	 * 
	 * @return {@link ServiceType}
	 * */
	@Override
	public abstract ServiceType getServiceType();

	/**
     * &lt;control&gt; 내의 &lt;bo&gt;, &lt;method&gt;를 구분하기 위해 구현해야함
     *
     * @return boolean &lt;control&gt;에 속해있을 경우 true를 리턴하도록 구현
     */
	@Override
	public boolean isControlBlock() {
		return false;
	}

	/**
     * Sets the control block.
     *
     * @param controllable the new control block
     */
	@Override
	public void setControlBlock(boolean controllable) {
	}

	/**
	 * {@inheritDoc}
	 * */
	@Override
    public String getNodeName() {
		return nodeName;
	}
	
	/**
	 * @param nodeName {@link Service} 의 NodeName
	 * */
	public void setNodeName(String nodeName) {
		this.nodeName = nodeName;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Service getParent() {
		return parent;
	}

	/**
	 * 자신의 상위 {@link Service} 를 설정한다.
	 * 
	 * @param parent 상위 {@link Service}
	 * */
	public void setParent(Service parent) {
		this.parent = parent;
	}
}
